package com.tea.admin.modules.app.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

import com.tea.admin.modules.app.utils.MapUtil;

import com.tea.common.common.util.result.Result;
import com.tea.common.entity.Store;
import com.tea.common.service.StoreService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.math.BigDecimal;
import java.util.Map;
import java.util.Objects;

/**
 * 门店管理控制器
 */
@RestController
@RequestMapping("/api/admin/stores")
@Api(tags = "门店管理")
@RequiredArgsConstructor
public class StoreController {

    private final StoreService storeService;

    /**
     * 分页查询门店列表
     */
    @GetMapping("/page")
    @ApiOperation("分页查询门店列表")
    public Result<IPage<Store>> page(
            @RequestParam(defaultValue = "1") Integer current,
            @RequestParam(defaultValue = "10") Integer size,
            @RequestParam(required = false) String name,
            @RequestParam(required = false) Integer status) {
        
        // 构建查询条件
        LambdaQueryWrapper<Store> queryWrapper = new LambdaQueryWrapper<Store>()
                .like(name != null, Store::getName, name)
                .eq(status != null, Store::getStatus, status)
                .orderByDesc(Store::getId);
        
        // 执行分页查询
        IPage<Store> page = storeService.page(new Page<>(current, size), queryWrapper);
        
        return Result.ok(page);
    }
    
    /**
     * 获取门店详情
     */
    @GetMapping("/{id}")
    @ApiOperation("获取门店详情")
    public Result<Store> getById(@PathVariable Long id) {
        Store store = storeService.getById(id);
        if (store == null) {
            return Result.fail("门店不存在");
        }
        return Result.ok(store);
    }
    
    /**
     * 新增门店
     */
    @PostMapping
    @ApiOperation("新增门店")
    public Result<Void> save(@RequestBody Store store) {
        // 参数校验
        if (store.getName() == null || store.getName().trim().isEmpty()) {
            return Result.fail("门店名称不能为空");
        }
        if (store.getAddress() == null || store.getAddress().trim().isEmpty()) {
            return Result.fail("门店地址不能为空");
        }
        
        // 如果没有提供经纬度但提供了地址，尝试通过地址获取经纬度
        if (store.getLongitude() == null || store.getLatitude() == null) {
            try {
                // 调用地图工具类获取经纬度
                Map<String, String> geocode = MapUtil.getGeocode(store.getAddress());
                store.setLongitude(new BigDecimal(geocode.get("longitude")));
                store.setLatitude(new BigDecimal(geocode.get("latitude")));
            } catch (Exception e) {
                // 获取经纬度失败，记录日志但不中断流程
                System.out.println("获取地址经纬度失败: " + e.getMessage());
            }
        }
        
        // 默认设置为营业状态
        if (store.getStatus() == null) {
            store.setStatus(1);
        }
        
        // 保存门店信息
        boolean success = storeService.save(store);
        
        return success ? Result.ok() : Result.fail("保存失败");
    }
    
    /**
     * 修改门店
     */
    @PutMapping("/{id}")
    @ApiOperation("修改门店")
    public Result<Void> update(@PathVariable Long id, @RequestBody Store store) {
        Store storeDb = storeService.getById(id);

        // 检查门店是否存在
        if (Objects.isNull(storeDb)) {
            return Result.fail("门店不存在");
        }
        
        // 设置ID
        store.setId(id);
        
        // 如果地址被修改且没有提供新的经纬度，尝试通过地址获取经纬度
        Store oldStore = storeService.getById(id);
        if (!oldStore.getAddress().equals(store.getAddress()) && 
            (store.getLongitude() == null || store.getLatitude() == null)) {
            try {
                // 调用地图工具类获取经纬度
                Map<String, String> geocode = MapUtil.getGeocode(store.getAddress());
                store.setLongitude(BigDecimal.valueOf(Long.parseLong((geocode.get("longitude")))));
                store.setLatitude(BigDecimal.valueOf(Long.parseLong((geocode.get("latitude")))));
            } catch (Exception e) {
                // 获取经纬度失败，记录日志但不中断流程
                System.out.println("获取地址经纬度失败: " + e.getMessage());
            }
        }
        
        // 更新门店信息
        boolean success = storeService.updateById(store);
        
        return success ? Result.ok() : Result.fail("更新失败");
    }
    
    /**
     * 删除门店
     */
    @DeleteMapping("/{id}")
    @ApiOperation("删除门店")
    public Result<Void> delete(@PathVariable Long id) {
        // 检查门店是否存在
        Store store = storeService.getById(id);
        if (store == null) {
            return Result.fail("门店不存在");
        }
        
        // 可以先检查门店是否有关联的订单或商品，如果有则不允许删除
        // 此处为简化逻辑，直接删除
        boolean success = storeService.removeById(id);
        
        return success ? Result.ok() : Result.fail("删除失败");
    }
    
    /**
     * 更新门店状态（营业/停业）
     */
    @PutMapping("/{id}/status")
    @ApiOperation("更新门店状态")
    public Result<Void> updateStatus(@PathVariable Long id, @RequestParam Integer status) {
        Store storeDb = storeService.getById(id);
        // 检查门店是否存在
        if (Objects.isNull(storeDb)) {
            return Result.fail("门店不存在");
        }
        
        // 检查状态值是否有效
        if (status != 0 && status != 1) {
            return Result.fail("无效的状态值");
        }
        
        // 更新门店状态
        Store store = new Store();
        store.setId(id);
        store.setStatus(status);
        boolean success = storeService.updateById(store);
        
        return success ? Result.ok() : Result.fail("更新状态失败");
    }
}